package com.dc.commons.helper;

import java.io.IOException;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.dc.commons.json.DcObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ser.FilterProvider;

/*******************************************************************************<P>
 * 文件名: JsonHelper.java <br>
 * 版本: 1.0<br>
 * 描述: Json 辅助类  实现了 Json转对象，对象转Json<br>
 * 版权所有: <br>
 * <P>
 * 创建者: 王建栋 <br>
 * 创建日期: 2015年12月14日 下午10:15:54<br>
 * 修改者: <br>
 * 修改日期: <br>
 * 修改说明: <br>
 ******************************************************************************/
public class JsonHelper {

	private static final Logger logger=LoggerFactory.getLogger(JsonHelper.class);
	
	public static DcObjectMapper getDcObjectMapper(){
		return new DcObjectMapper();
	}
	
	
	/**
	 * 将 json 对象转换为对象 
	 * @param json
	 * @param typeReference
	 * @return Object
	 */
	public static <T> T fromJsonToObject(String json, TypeReference<T> typeReference) {
		try {
			return getDcObjectMapper().readValue(json, typeReference);
		} catch (IOException e) {
			logger.error("Json转换错误, class={},cause={},json={}",typeReference.getType().getClass(),e.getMessage(),json);
			ExceptionHelper.printStackTrace(e);
		}
		return null;
	}
	
	/**
	 * 将 json 对象转换为对象 
	 * @param json
	 * @param valueType
	 * @return Object
	 */
	public static <T> T fromJsonToObject(String json, Class<T> valueType) {
		try {
			return getDcObjectMapper().readValue(json, valueType);
		} catch (IOException e) {
			logger.error("Json转换错误, class={},cause={},json={}",valueType,e.getMessage(),json);
			ExceptionHelper.printStackTrace(e);
		}
		return null;
	}
	
	/**
	 *  将Json 对象转换为 列表
	 * @param json
	 * @param clazz
	 * @return ObjectList
	 */
	public static <T,clazz>T fromJsonToList(String json, Class<T> clazz) {
		try {
			return getDcObjectMapper().readValue(json, new TypeReference<List<clazz>>(){});
		} catch (IOException e) {
			logger.error("Json转换错误, class={},cause={},json={}",clazz,e.getMessage(),json);
			ExceptionHelper.printStackTrace(e);
		}
		return null;
	}
	
	/**
	 * 将对象转换为字符串
	 * @param object
	 * @return objectJson
	 */
	public static String fromObjectToJson(Object object){
		try {
			return getDcObjectMapper().writeValueAsString(object);
		} catch (JsonProcessingException e) {
			logger.error("Json转换错误, object={},cause={}",object,e.getMessage());
			ExceptionHelper.printStackTrace(e);
		}
		return null;
	}
	
	/**
	 * 将对象转换为字符串
	 * @param object
	 * @return objectJson
	 */
	public static String fromObjectToJson(Object object,FilterProvider filterProvider){
		try {
			return getDcObjectMapper().writer(filterProvider).writeValueAsString(object);
		} catch (JsonProcessingException e) {
			logger.error("Json转换错误, object={},cause={}",object,e.getMessage());
			ExceptionHelper.printStackTrace(e);
		}
		return null;
	}
	
}
